/*************************
*** File myList.h
**************************/

#ifndef MYLIST_H_INCLUDED
#define MYLIST_H_INCLUDED

#ifndef LNTYPE
#define LNTYPE void *
#endif

typedef struct myNode {
    LNTYPE data;
    struct myNode *next;
} MyNode;

typedef struct myList {
    MyNode *first;
    MyNode *last;
    int count;
    int (*equal)(LNTYPE a, LNTYPE b);
} MyList;

typedef struct myListIterator {
    MyNode *p;
    int count;
    int allSize;
} MyListIterator;


//创建链表
MyList *createMyList(void);

//创建链表，带有相等参数，用于查找
MyList *createMySearchList(int(*equal)(LNTYPE a, LNTYPE b));

//释放链表
void freeMyList(MyList *list);

//释放链表节点数据都为malloc指针，一同释放
void freeMyListP(MyList *list);

//插入在尾部
void myListInsertDataAtLast(MyList* const list, LNTYPE data);

//插入在首部
void myListInsertDataAtFirst(MyList * const list, LNTYPE data);

//插入
void myListInsertDataAt(MyList * const list, LNTYPE data, int index);

//删除并返回尾部节点的数据
LNTYPE myListRemoveDataAtLast(MyList* const list);

//删除并返回首部节点的数据
LNTYPE myListRemoveDataAtFirst(MyList * const list);

//删除并返回指定index的节点
MyNode* myListRemoveDataAt(MyList* const list, int index);

//删除指定值的节点,并返回是否删除成功
int myListRemoveDataObject(MyList* const list, LNTYPE data);

//长度
int myListGetSize(const MyList * const list);

//打印
void myListPrint(const MyList * const list, void(*pt)(const LNTYPE * const));

//取得数据
MyNode* myListGetDataAt(const MyList * const list, int index);

//取得第一个数据
MyNode* myListGetDataAtFirst(const MyList * const list);

//取得最后一个数据
void* myListGetDataAtLast(const MyList * const list);

 
//查找某个数据的位置,如果equal方法为空，比较地址，否则调用equal方法
//如果不存在返回-1，如果存在，返回出现的第一个位置
int myListFindDataIndex(const MyList * const list, LNTYPE data);

//查找某个数据的位置,如果equal方法为空，则直接比较，否则调用equal方法
//如果不存在返回NULL，如果存在，否则返回查到的数据地址
//This is only for Set2Map
LNTYPE *myListFindDataAddr(const MyList * const list, LNTYPE data);
 
//创建遍历器
MyListIterator* createMyListIterator(const MyList * const list);

//释放遍历器
//void freeMyListIterator(MyListIterator* iterator);

//遍历器是否有下一个元素
int myListIteratorHasNext(const MyListIterator* const iterator);

//返回遍历器的下一个元素
LNTYPE myListIteratorNext(MyListIterator* const iterator);

#endif // MYLIST_H_INCLUDED
